iT邦幫忙

2026 iThome 鐵人賽

DAY 4
0
Security

[自學筆記] 還在路上!我的 IPAS 資訊安全工程師初級備考紀錄系列 第 4

Day 4:Kerberos 票證王國,一張被我退貨三次的迪士尼通行證

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20260905/20171720rGK68URZoH.png


開場:多模型神仙打架——Codex 狠抓 Claude 的邏輯矛盾與孤島斷線

身分鑑別在 iPAS 與資安實務裡,常被誤以為只是「帳密與驗證碼」的常識題。但真正深入底層協議與官方考題陷阱,處處都是踩下去就炸的盲點。

為了把這篇的硬骨頭徹底嚼碎,我讓產線跑了一場多模型攻防:我調度 Claude 起草,再調度 Codex 扮演嚴格的資安審查員抓漏,最後讓 Claude 依據審查意見回頭精修。三個角色各司其職,誰都不能一次寫完就交差。

結果 Codex 這一輪直接揪出 Claude 兩個讓人臉紅的硬傷。

第一個是 MFA 陷阱二的自相矛盾。

Claude 的原始草稿把「密碼+安全問題」當成雙因子的示範組合,但這兩樣東西本質上都是「你知道的東西」(knowledge factor)。疊再多層也只是同一種因子的自我重複,根本不構成真正的多因子——這正是官方考古題愛埋的真陷阱,Claude 自己踩了進去還不自知。

Codex 審查時毫不留情地把它挑了出來,要求把這段論述徹底拆開:

  • 把「密碼+安全問題」列為官方純陷阱,不准再當作正面示範。
  • 另外獨立拆出一節分析 SIM Swap:手機收簡訊驗證碼看似「你持有的東西」,但一旦電信商被社交工程轉移門號,持有因子瞬間變成攻擊者持有。這才是「持有因子」在現實世界裡的失效邊界。

兩者層次完全不同,不能混為一談。

第二個是 FIDO2 公鑰的孤島閉環。

Claude 原本只寫了「私鑰留在裝置內」,卻把「公鑰註冊到伺服器」的關鍵閉環漏掉了。整段論述變成一座孤島,讀者看完只知道私鑰很安全,卻不知道伺服器到底拿什麼來比對驗證。

Codex 直接指出這種斷線看似完整、實質殘缺,要求 Claude 必須把公私鑰的配對閉環接回去。

連帶地,Codex 也把 CER(Crossover Error Rate,交叉錯誤率,亦稱 Equal Error Rate, EER)的定義狠狠校正了一次:

它是 FAR(誤識率)與 FRR(拒識率)兩條曲線相交的那一點,也就是 FAR = FRR 的那個操作點。

在該操作點上的錯誤率越低,代表生物辨識器的區辨效能越好。這是業界用來客觀比較不同辨識器效能的基準指標,不能像 Claude 初稿那樣用「整體準確度」模糊帶過。

我看著 Codex 吐出來的這份審查清單,直接拍板:全部照改。

第一幕:迪士尼樂園三步曲——把 6 個封包嚼碎成雙解析度模型

Kerberos 這一節的起點,是我丟出的一句話:

「問:Kerberos 三步曲是什麼?」

Kerberos 的六個封包(AS-REQ、AS-REP、TGS-REQ、TGS-REP、AP-REQ、AP-REP)第一次看很容易變成背誦題,背完考完就忘。所以這裡用雙解析度——先用生活比喻建立直覺,再用封包對應收斂回技術定義。

比喻是迪士尼樂園的一日遊:

https://ithelp.ithome.com.tw/upload/images/20260905/20171720MjxCvY6rAy.jpg

第一步:大門換手環(拿 TGT)
你到大門出示身分證明,換到一條腕帶——這是 Ticket Granting Ticket,證明「你今天已經在門口驗過身分」。但這條腕帶不能直接讓你上任何一個遊樂設施。

第二步:服務中心換太空山專用票(拿 Service Ticket)
你拿著腕帶走到太空山旁邊的服務窗口,出示腕帶,換一張太空山專用票。這張票只認太空山,拿去坐旋轉木馬沒有用。

關鍵在於:這張票不是一次性的。在它的有效期限內(AD 預設 10 小時),你可以拿著同一張票反覆入場排隊、反覆搭乘很多次,不用每次都跑回服務中心重換。

第三步:剪票口對時間戳(Authenticator 驗證)
但「同一張票可以用很多次」,不代表每次入場都拿完全相同的東西交差。

每次你要上車,都必須由你(Client)用跟服務中心約定好的暗號(Session Key)現場寫一張新的小紙條,貼上「現在幾點幾分」——這對應每次 AP-REQ 都要重新產生一份新的 Authenticator。

剪票口的工作人員(服務端)收到後做兩件事:

  1. 解開暗號核對時間戳:前後容許誤差通常抓 ±5 分鐘,超過這個窗口直接拒絕。
  2. 查閱防冒用名單:查一下自己手上「剛剛看過哪些小紙條」的名單(Replay Cache),確認這張紙條剛才沒有人用過,杜絕有人撿到別人寫過的紙條在窗口內重放冒用。

純文字流程框,每行都壓在 16 字元內,適應 360px 直屏單手閱讀:

使用者->KDC
 出示身分
 換TGT

持TGT->KDC
 換太空山票

持票+時戳->服務
 剪票核對時間

(這張太空山票在有效期內可以重複走「持票+時戳→服務」這一步很多次,每次都要帶一份新的時間戳小紙條,不是走一次就作廢。)

比喻講到這裡很順,但比喻一定有失效邊界,這篇不打算讓比喻蒙混過關:

  • 票證時效性:手環跟票都有效期限,過期要重新排隊,這在 Kerberos 裡對應 TGT/Service Ticket 的存活時間,時間一到強制重新驗證,不是永久通行證。
  • 跨 domain 信任:迪士尼樂園裡的票不能拿去隔壁環球影城用,除非兩個樂園簽了聯盟協議——這對應跨 Realm 的信任關係(trust),不是預設互通,要額外建立。
  • 單點風險:整座樂園的手環跟票都由服務中心(KDC)統一發放,服務中心一旦被攻破,所有票證的信任基礎都塌了。這一點比喻只能點到為止,真正的殺傷力留到下一幕拆。

第二幕:紅隊極限拷問——Kerberos 防重送「防不住什麼?」

比喻講完,紅隊視角就上場了。我問:

「問:Kerberos防重送攻擊 防不住什麼?」

這句話把整篇文章從「介紹機制」拉到「攻防死角」。防重送靠的是 Authenticator 帶時間戳,理論上重放攻擊在時間窗內就會被擋下,但這句反問直接戳破「防重送=萬無一失」的錯覺。收斂出四個致命死角:

https://ithelp.ithome.com.tw/upload/images/20260905/20171720UnHJyViyKJ.jpg

死角一:叢集跨節點重放(Replay Cache 邊界)
時間戳容許誤差通常設 ±5 分鐘,這個窗口是為了容忍網路延遲與時鐘漂移的工程權衡。

但這個死角要成立,必須建立在一個關鍵前提上:後端有多台負載平衡叢集節點共用同一個 SPN 與服務金鑰,而節點之間並未共享 Replay Cache

因為票證本身不能任意丟給其他服務使用,攻擊必須發生在同一組 SPN 的節點之間。在這個前提下,攻擊者只要在 5 分鐘窗口內截獲合法的 AP-REQ,立刻將這張票重送到另一台還沒看過此 Authenticator 的節點:

  • 該節點的快取是空的。
  • 時間戳在 ±5 分鐘合法範圍內。
  • 重放攻擊直接得逞。
  • 利用條件:負載平衡叢集共用 SPN/服務金鑰,但節點間未建立共享 Replay Cache。
  • 偵測訊號:Event ID 4769 是客戶端向 KDC 申請服務票(TGS-REQ)留下的紀錄,並非 AP-REQ 這種點對點重送的直接證據——跨節點重放發生在客戶端與服務端之間,KDC 完全看不到這一步。真正能抓到這個死角,得依賴服務端或網路層的遙測,監控短時間內跨節點重複出現完全相同的 Authenticator 時間戳記。
  • 補償控制:核心不在盲目縮短時間窗(避免引發可用性災難),而在落實節點間的共享快取機制,或在傳輸層加上 Nonce、綁定 TLS Channel Binding。

死角二:黃金票據(Golden Ticket)
這一格根本不能算防重送失守,而是根信任被連根拔起。

攻擊者一旦取得 krbtgt 帳號的長期金鑰材料(AES key 或 NTLM hash),就能完全離線、不經過 KDC,偽造出任意使用者、任意權限、任意存活時間的 TGT。

krbtgt 是整條信任鏈的根。根一旦失守,下面所有票證的驗證都是空話——時間戳、Replay Cache 這些防重送防禦,在這裡完全派不上用場。

  • 利用條件:攻擊者已取得網域控制站等效權限,或透過 DCSync 擷取 krbtgt 金鑰材料。
  • 偵測訊號:威脅獵捕時關聯日誌,發現客戶端出示的 TGT 缺少前置向 KDC 申請的 AS-REQ 記錄(有 4769 但無對應 4768),或票證生存期異常超長。
  • 補償控制krbtgt 密碼雙輪替(見下)、DC 列為 Tier 0 資產嚴格隔離管控、部署 DCSync 相關偵測規則。

死角三:白銀票據(Silver Ticket)
邏輯跟黃金票據同構,只是金鑰換成單一服務帳號的密碼金鑰,偽造範圍收斂到該特定服務。

因為流程完全繞過 KDC、直接跟服務端打交道,KDC 根本不會留下任何發票紀錄,在中心化日誌稽核中極難被察覺。

  • 利用條件:取得特定服務帳號的密碼金鑰(如 Kerberoasting 離線破解或記憶體傾印)。
  • 偵測訊號:服務端收到的 Service Ticket 在 KDC 端完全找不到對應的 TGS-REQ 申請紀錄,KDC 與應用端日誌出現稽核落差。
  • 補償控制:服務帳號改用 gMSA(見下)、開啟服務端完整稽核記錄、啟用 Kerberos PAC 驗證。

死角四:Kerberoasting 離線字典破解
這是四個死角裡最貼近日常滲透情境的一個。

任何一個已認證的網域使用者,都可以合法地為任何註冊了 SPN 的服務帳號索取一張 Service Ticket。這一步完全合規,不會觸發任何異常警報。

拿到票之後,攻擊者把票拖到本機離線環境,用字典或暴力破解服務帳號的密碼雜湊。只要服務密碼不夠長、又沒定期輪換,遲早被算出來。這正是我後面追問的核心:

「問:Kerberoasting 離線字典破解的原理是什麼?」

答案就是八個字:「合法索票、離線破解」

攻擊發生在協議邊界之外,Kerberos 協議層本身完全管不到。防守只能回歸基本面:服務帳號的密碼強度與自動輪替機制。

  • 利用條件:任何已認證的網域使用者即可發起,針對註冊了 SPN 的人管服務帳號。
  • 偵測訊號:單一帳號短時間內密集發出大量 TGS-REQ,且伴隨要求將加密演算法降級為 RC4 的異常行為。
  • 補償控制:服務帳號全面改用 gMSA、禁用弱加密 RC4、定期審查高權限服務帳號並收斂其暴露面。

第三幕:CISO 全生命週期治理——AI 時代的 5min 與 Tier 0 皇冠明珠

四大死角拆完,我把問題丟到治理層級,一次問了五題:

「問:1.在AI範例的現在,5min是不是適當? 2.KDC很重要,需要怎麼防護? 3.該服務自己的帳號密碼應該要怎麼防護? 4.Kerberoasting 離線字典破解的原理是什麼? 5.Kerberos還是顯學嗎?未來會被什麼取代嗎?」

5 分鐘在 AI 時代夠不夠?
Windows 預設的 5 分鐘容許誤差,本質上是在「網路延遲/時鐘漂移」與「安全窗口」之間抓的工程妥協。

窗口拉短,確實能壓縮死角一的重放可乘之機,但代價是極易因微小的時鐘不同步,引發合法請求被大面積拒絕的可用性災難。

工程防護的核心從來不是盲目把窗口縮到極限,而是:

  1. 顧好 NTP 時間同步的精準度:只要時間源準確,窗口就能安全維持在標準值。
  2. 在負載平衡架構落實共享快取:從架構端切斷跨節點利用條件。

KDC 是 Tier 0 皇冠明珠
KDC 保管 krbtgtkrbtgt 是整條 Kerberos 信任鏈的根。

這台機器(在 AD 環境通常就是網域控制站 DC)必須被當成 Tier 0 核心資產防護:實體與網路實體隔離、使用 PAW 特權專用工作站管理、任何存取登入皆留存不可抹滅的稽核軌跡。

這裡更藏著一個極易在維運中踩雷的實務關鍵——krbtgt 密碼的「雙輪替法則」

  • 為什麼不能只換一次?
    AD 為了維持服務相容,會同時保留「當前」與「前一版」兩份金鑰。只換一次密碼,前一版金鑰依然有效,攻擊者依舊能拿著舊金鑰偽造出合法 TGT。
  • 為什麼兩次輪替中間必須等待超過 10 小時?
    必須等待超過票證的最大生命週期(預設 10 小時),確保先前由舊金鑰簽發的所有合法票證自然過期失效後,再執行第二次輪替。這時新舊雜湊才會被徹底洗淨,真正完全終結黃金票據的偽造路徑。

服務帳號密碼怎麼防?
告別人工設定、憑記憶維護的脆弱密碼,全面擁抱 gMSA(group Managed Service Account)

密碼由作業系統底層自動維護,具備兩大特性:

  • 採用高強度長隨機字串。
  • 預設每 30 天由系統自動輪替。

因為「連系統管理員都不知道密碼是什麼」,直接消滅了人為弱密碼與字典破解的機會,從根源化解死角四(Kerberoasting)的威脅。

Kerberos 還是顯學嗎?
在傳統企業內網與地端 AD 環境裡,它依然是穩固的主力,短期內絕不可能退場。

但當代架構的重心正在平滑轉移:

  • Web 與跨組織單一登入:交由雲端原生的 OIDC 與 SAML 接手。
  • 終端使用者驗證:走向抗釣魚的 FIDO2 Passkey。

Kerberos 並非走向滅亡,而是收斂成現代混合雲身分架構中的內網基石,與雲端協定各司其職、相互並存。

帶得走的硬核乾貨:MFA 真偽陷阱與四大死角避坑卡片

卡片一|MFA 真偽陷阱
密碼 + 安全問題 = 假雙因子(都是 knowledge factor,本質同一種)
手機簡訊碼會被 SIM Swap 劫持(持有因子可被社交工程轉移)
FIDO2:私鑰留裝置,公鑰要註冊回伺服器,兩端缺一不成立

卡片二|Kerberos 四大死角
① 叢集跨節點重放:共用 SPN 節點若未共享 Replay Cache 遭重送(核心在健全 NTP 與共享快取,非誤判 4769 為 AP-REQ 證據)
② 黃金票據:krbtgt 長期金鑰外洩=根信任崩潰,離線偽造任意 TGT(需兩次輪換 >10h)
③ 白銀票據:單一服務金鑰外洩=偽造該服務(繞過 KDC,日誌比對可抓漏)
④ Kerberoasting:合法索票+離線暴力破解弱服務密碼(改用 gMSA 根治)

卡片三|考古題現場逆向解剖
115-1 科一 Q26|CER 交叉錯誤率(Crossover Error Rate,亦稱 Equal Error Rate, EER):FAR 與 FRR 兩條曲線的相交點,即 FAR = FRR 的那個操作點;在該操作點的錯誤率較低,是業界用來客觀比較不同生物辨識器效能的基準指標,不是「整體準確度越高」這種簡化說法。
科一 Q34|加鹽 Hash+KDF 防彩虹表:Salt 讓相同明文密碼產生不同雜湊,破壞彩虹表預先計算的對照優勢;KDF(如 PBKDF2/bcrypt/Argon2)刻意拉高運算成本,讓暴力破解單位時間內能試的次數大幅下降,兩者搭配才是完整防線,缺一不可。
科一 Q25|自然人憑證安全等級:屬於雙因子(IC 卡持有+PIN 碼知識),比純密碼登入高一個等級,但仍受限於讀卡機與驅動環境,安全性不等於絕對免疫。

📖 30 天學習筆記精華摘要:地基不穩,門神再多也沒用

30 天衝到 Day 4,我把整章筆記拆成「先立骨、後填肉、再磨反射」三層,這是這份筆記從頭到尾唯一沒變過的骨架。丟給趕時間的你,先看這段抓重點就夠。

先立骨:鑑別是地基,不是門神排隊的第一關。 存取控制的三步驟——鑑別、授權、可歸責性——常被畫成一串平行的門。但這排序有個容易被忽略的前提:授權判斷的是「這個已知身分能做什麼」,身分本身是假的,後面規則全部失效。RBAC 設計得再嚴謹,攻擊者用偷來的密碼登入,RBAC 只是很有效率地把權限精準交給了他。這就是為什麼鑑別環節在存取控制章節裡自成一個高頻考區。

後填肉,三塊硬骨頭:

  • MFA 跨因子邊界:判斷 MFA 的鐵律只有一條——算「獨立要素類別數」,不是「驗證步驟數」。密碼+PIN、密碼+安全問題答案都是「所知」疊「所知」,官方考題最愛埋這個陷阱。密碼+SMS 簡訊類別上算跨了兩類,但業界真正該警惕的是 SIM Swap 與 SS7 劫持能把「所有」這個要素整組偷走,NIST SP 800-63B 早把簡訊列為受限方式。
  • Kerberos 雙門神與時戳:AS 只做一件事——驗證身分發 TGT;TGS 憑 TGT 換 Service Ticket,全程密碼只在第一步用一次、不傳明文。防重送靠的是 Authenticator 時間戳加 Replay Cache,理論上很牢,但這道防線防不住四種死角:叢集跨節點重放、黃金票據(krbtgt 根信任崩潰)、白銀票據(單一服務金鑰外洩)、Kerberoasting(合法索票、離線暴力破解)。時戳只防得住「拿舊票重放」,防不住「拿真印章現蓋新票」。
  • SAML / OAuth / OIDC 分工:這三個常被初學者當成同一次登入的連續動作,其實對應三種場景。SAML 是企業跨域 SSO 的 XML 身分宣告;OAuth 2.0 是授權框架,Access Token 只回答「你能做什麼」;OIDC 疊加 ID Token,才回答「你是誰」。混用兩者,等於拿一張授權範圍過廣的鑰匙卡去冒充身分。

再磨反射,收斂成三個直覺反應:

  • FIDO2 閉環:核心不是「換一種登入方式比較方便」,而是徹底改變攻擊者能拿到什麼。私鑰留裝置、公鑰上傳伺服器,資料庫整包外洩,攻擊者拿到的公鑰也反推不出私鑰、偽造不了簽章。代價是裝置遺失時的復原流程,要另外設計清楚。
  • CER 交叉點:FAR(誤放)曲線與 FRR(誤殺)曲線相交的那個操作點,數值越低代表演算法本身越精準,是拿來比較不同廠商產品的規格值,不是你上線後一定要用的操作門檻——銀行金庫會刻意調得比 CER 更嚴。
  • 加鹽 KDF:Salt 讓同樣密碼在不同帳號產生不同雜湊,打破彩虹表「一表打天下」的前提;KDF 疊加刻意拖慢的重複運算,拉高單帳號暴力破解的成本。兩者是疊加關係,不是二選一。

以上是骨架,血肉留在完整筆記裡:9 大專有名詞生活比喻字典、Kerberos 三步曲的直式流程框、三道考古題逐選項拆解、還有 NIST SP 800-63B 的 IAL / AAL / FAL 延伸考點,都在這裡,手機直接開來滑:

👉 Day 4 完整衝刺筆記:身分鑑別與存取控制(下)

結語:筆記磨透才發文

這篇文章的產線,從頭到尾是人掌舵、AI 划槳:

  • MFA 邏輯陷阱與 FIDO2 孤島,是 Codex 抓出來、Claude 補回去的。
  • Kerberos 四大攻防死角,是我用一句紅隊反問逼出來的。

技術細節怎麼定案,前面幾幕已經交代清楚,這裡不贅述。總之那句話:筆記沒磨到定稿,我不搶著發文。

發文前我對這份 HackMD 定稿筆記做了一次實體驗證,不是憑印象確認,是真的跑:

curl -sL https://hackmd.io/@lanss/BkzVADOOMl/download \
  -o /tmp/hackmd_day4.md
diff /tmp/hackmd_day4.md day4/auth_and_sso_part2.md
echo "diff exit code: $?"

diff 輸出為空、exit code 為 0,代表 HackMD 上的定稿內容跟本地 day4/auth_and_sso_part2.md 逐字一致,這篇文章才是根據那份筆記寫成,不是憑記憶轉述。

Persona 2.2 就是在這篇的來回攻防裡定型的:

  • 多模型要互相抓漏
  • 比喻要主動點出失效邊界
  • 機制要被紅隊反問逼到極限
  • 最後拿真實的 diff 指令驗證發文內容跟定稿一致

少了一環,這篇就不算磨透。


上一篇
Day 3:存取控制七大門神,一碗差點被搶先端出去的牛肉湯
下一篇
Day 5:管委會抓漏抓到一半,為什麼要換成醫院健檢台?
系列文
[自學筆記] 還在路上!我的 IPAS 資訊安全工程師初級備考紀錄6
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言